<?php
/*
 * @开发工具: JetBrains PhpStorm.
 * @文件名：Process.class.php
 * @类功能: 进程管理
 * @开发者: zc
 * @开发时间： 15-10-22
 * @版本：version 1.0
 */
class Process{
    //调用变量
    private $status = null;
    private $task_id = null;
    private $task_data = null;

    //静态变量
    private static $pid_file = PATH."Parameter".DS."pid";

    /**
     * @功能：创建一个子进程
     * @param string $task_id 任务ID
     * @param string $task_data 任务内容
     * @开发者: zc
     */
    public function create_process($task_id, $task_data){
        //设置变量
        $this->task_id = $task_id;
        $this->task_data = $task_data;

        //创建进程，设置回调函数
        $process = new \swoole_process(array($this,"run"));
        if(!($pid = $process->start())) {
            Log::write("创建进程失败！");
        }

        //写进程日志
        Log::write("创建进程成功！");
    }

    /**
     * 子进程执行的入口
     * @param $worker object 进程
     * @开发者: zc
     */
    public function run($worker){
        //设置进程名称
        $worker->name("zc_process_server_" . $this->task_id);

        //取得定秒数
        $time = intval($this->task_data[0]);
        if($time <= 0){
            $time = 1;
        }

        //开启定时器
        \swoole_timer_tick(($time * 1000), function () {
            //判断是否需要调用方法
            if(empty($this->status)) {
                //设置状态
                $this->status = "START";

                //启动任务
                $url = url($this->task_data[1]) . "?t=".time();

                //设置post请求参数
                $curl = curl_init(); //开启curl
                curl_setopt($curl, CURLOPT_HTTPHEADER,array("content-type: text/html;charset=utf-8"));
                curl_setopt($curl, CURLOPT_URL, $url); //设置请求地址
                curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  //是否输出 1 or true 是不输出 0  or false输出
                curl_setopt($curl, CURLOPT_POST, false); //是否使用post方法请求
                curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
                curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);

                //发起post请求,解析返回值
                $result = curl_exec($curl);

                //关闭网络请求
                curl_close($curl);

                //初期化状态
                $this->status = null;
            }else{
                Log::write("上一次任务未处理完，等待......，相关数据：".json_encode($this->task_data));
            }

            //判断是否需要推送
            if(!file_exists(self::$pid_file)){
                exit;
            }
        });
    }
}

